home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / sml_nj / 93src.lha / src / hppa / hppainstr.sml < prev    next >
Encoding:
Text File  |  1993-01-27  |  12.2 KB  |  339 lines

  1. (* Copyright 1992 Scott Draves *)
  2.  
  3. structure HppaInstrSet =
  4. struct
  5.  
  6.     datatype register  =  REG of int  (* general purpose *)
  7.     datatype fregister = FREG of int  (* floating point *)
  8.     datatype cregister = CREG of int  (* control *)
  9.     datatype sregister = SREG of int  (* space (aka segment) *)
  10.  
  11.     val zero_reg  =  REG 0   (* wired to 0 *)
  12.     val addr_reg  =  REG 1   (* used by addil *)
  13.     val shift_reg = CREG 11  (* used by variable shift/bitfield *)
  14.  
  15.     type im5  = int
  16.     type im11 = int
  17.     type im12 = int
  18.     type im13 = int
  19.     type im14 = int
  20.     type im17 = int
  21.     type im21 = int
  22.  
  23.     fun im5  n =  n <    16 andalso n >=    ~16
  24.     fun im11 n =  n <  1024 andalso n >=  ~1024
  25.     fun im12 n =  n <  2048 andalso n >=  ~2048
  26.     fun im14 n =  n <  8192 andalso n >=  ~8192
  27.     fun im17 n =  n < 65536 andalso n >= ~65536
  28.  
  29.     fun hi21 n = Bits.rshift(n, 11)
  30.     fun lo11 n = Bits.andb(n, 0x7ff)
  31.  
  32.     datatype modifyshift
  33.     = ms_none | ms_shift | ms_modify | ms_shift_modify
  34.  
  35.     datatype modifyab
  36.     = mab_none | mab_before | mab_after
  37.  
  38.     datatype modifybe
  39.     = mbe_begin | mbe_end | mbe_begin_modify | mbe_end_modify
  40.  
  41.     datatype nullify
  42.     = n_nullify | n_no_nullify
  43.  
  44.     datatype arithcond
  45.       = cc_never
  46.       | cc_equal
  47.       | cc_less
  48.       | cc_less_or_equal
  49.       | cc_less_unsigned
  50.       | cc_less_or_equal_unsigned
  51.       | cc_signed_overflow
  52.       | cc_odd
  53.  
  54.     datatype arithcond2 = cc of arithcond | cc_not of arithcond
  55.  
  56.     val never = cc cc_never;
  57.  
  58.     datatype addcond
  59.     = ac_never
  60.  
  61.     datatype logicond
  62.     = lc_never
  63.         | lc_all_zero
  64.     | lc_leftmost_one
  65.     | lc_leftmost_one_or_all_zero
  66.     | lc_rightmost_one
  67.     | lc_always
  68.     | lc_some_one
  69.     | lc_leftmost_zero
  70.     | lc_leftmost_zero_and_some_one
  71.     | lc_rightmost_zero
  72.  
  73.     datatype unitcond
  74.     = uc_never
  75.         | uc_some_byte_zero
  76.         | uc_some_halfword_zero
  77.         | uc_some_digit_carry
  78.         | uc_some_byte_carry
  79.         | uc_some_halfword_carry
  80.  
  81.     datatype unitcond2 = uc of unitcond | uc_not of unitcond
  82.  
  83.     datatype shiftcond
  84.     = sc_never
  85.     | sc_all_zero
  86.     | sc_leftmost_one
  87.     | sc_rightmost_one
  88.     | sc_always
  89.     | sc_some_one
  90.     | sc_leftmost_zero
  91.     | sc_rightmost_zero
  92.  
  93.     datatype fpformat
  94.     = fpf_single | fpf_double | fpf_quad
  95.  
  96.     datatype fpcond
  97.     = fpc of {less      : bool,
  98.           greater   : bool,
  99.           equal     : bool,
  100.           unordered : bool,
  101.           trap      : bool
  102.           }
  103.  
  104.     datatype fphalf = FrLeftHalf | FrRightHalf
  105.  
  106.     (* we ignore most spaces, cache hints, and TLB operations.
  107.        the fields are in the same order as they appear in the
  108.        assembly code, with the exception of the store instructions,
  109.        where the src and dst are reversed (this makes sense if you
  110.        think about it long enough) *)
  111.  
  112.  
  113.     datatype 'label label_expr
  114.     = le_label   of 'label
  115.         | le_hi21    of 'label label_expr
  116.         | le_lo11    of 'label label_expr
  117.         | le_negate  of 'label label_expr
  118.         | le_sum     of 'label label_expr * 'label label_expr
  119.         | le_diff    of 'label label_expr * 'label label_expr
  120.         | le_divn    of 'label label_expr * int
  121.         | le_const   of int
  122.     | le_dot     (* the location of the instruction containing the expr *)
  123.  
  124.     
  125.     datatype 'label instruction
  126.  
  127.     = i_nop (* synthetic *)
  128.  
  129.     (* memory instructions *)
  130.                 (* base     offset   target/source *)
  131.     | i_ldw     of register * im14 * register
  132.     | i_ldh     of register * im14 * register
  133.     | i_ldb     of register * im14 * register
  134.     | i_stw     of register * im14 * register
  135.     | i_sth     of register * im14 * register
  136.     | i_stb     of register * im14 * register
  137.         | i_ldwm    of register * im14 * register
  138.     | i_stwm    of register * im14 * register
  139.  
  140.                 (* base       index                    target *)
  141.     | i_ldwx    of register * register * modifyshift * register
  142.     | i_ldhx    of register * register * modifyshift * register
  143.     | i_ldbx    of register * register * modifyshift * register
  144.     | i_ldwax   of register * register * modifyshift * register
  145.     | i_ldcwx   of register * register * modifyshift * register
  146.  
  147.                 (* base    offset              target *)
  148.     | i_ldws    of register * im5 * modifyab * register
  149.     | i_ldhs    of register * im5 * modifyab * register
  150.     | i_ldbs    of register * im5 * modifyab * register
  151.     | i_ldwas   of register * im5 * modifyab * register
  152.     | i_ldcws   of register * im5 * modifyab * register
  153.     | i_stws    of register * im5 * modifyab * register
  154.     | i_sths    of register * im5 * modifyab * register
  155.     | i_stbs    of register * im5 * modifyab * register
  156.     | i_stwas   of register * im5 * modifyab * register
  157.  
  158.     | i_stbys   of register * im5 * modifybe * register
  159.  
  160.     (* immediate instructions *)
  161.     | i_ldo     of register * im14 * register
  162.     | i_ldil    of im21 * register
  163.     | i_addil   of im21 * register
  164.  
  165.     (* branches *)
  166.     | i_bl      of im17 * nullify * register
  167.     | i_gate    of im17 * nullify * register
  168.     | i_blr     of register * nullify * register
  169.     | i_bv      of register * nullify * register
  170.     | i_be      of im17 * nullify * sregister * register
  171.     | i_ble     of im17 * nullify * sregister * register
  172.     | i_movb    of register * register * arithcond * im12 * nullify
  173.     | i_movib   of im5 * register * arithcond * im12 * nullify
  174.     | i_combt   of register * register * arithcond * im12 * nullify
  175.     | i_combf   of register * register * arithcond * im12 * nullify
  176.     | i_comibt  of im5 * register * arithcond * im12 * nullify
  177.     | i_comibf  of im5 * register * arithcond * im12 * nullify
  178.     | i_addbt   of register * register * arithcond * im12 * nullify
  179.     | i_addbf   of register * register * arithcond * im12 * nullify
  180.     | i_addibt  of im5 * register * arithcond * im12 * nullify
  181.     | i_addibf  of im5 * register * arithcond * im12 * nullify
  182.     | i_bvb     of register * shiftcond * im12 * nullify
  183.     | i_bb      of register * im5 * shiftcond * im12 * nullify
  184.  
  185.     (* computation *)
  186.     | i_add     of register * register * arithcond2 * register
  187.     | i_addl    of register * register * arithcond2 * register
  188.     | i_addo    of register * register * arithcond2 * register
  189.     | i_addc    of register * register * arithcond2 * register
  190.     | i_addco   of register * register * arithcond2 * register
  191.     | i_sh1add  of register * register * arithcond2 * register
  192.     | i_sh1addl of register * register * arithcond2 * register
  193.     | i_sh1addo of register * register * arithcond2 * register
  194.     | i_sh2add  of register * register * arithcond2 * register
  195.     | i_sh2addl of register * register * arithcond2 * register
  196.     | i_sh2addo of register * register * arithcond2 * register
  197.     | i_sh3add  of register * register * arithcond2 * register
  198.     | i_sh3addl of register * register * arithcond2 * register
  199.     | i_sh3addo of register * register * arithcond2 * register
  200.     | i_sub     of register * register * arithcond2 * register
  201.     | i_subo    of register * register * arithcond2 * register
  202.     | i_subb    of register * register * arithcond2 * register
  203.     | i_subbo   of register * register * arithcond2 * register
  204.     | i_subt    of register * register * arithcond2 * register
  205.     | i_subto   of register * register * arithcond2 * register
  206.     | i_ds      of register * register * arithcond2 * register
  207.     | i_comclr  of register * register * arithcond2 * register
  208.     | i_or      of register * register * logicond * register
  209.     | i_xor     of register * register * logicond * register
  210.     | i_and     of register * register * logicond * register
  211.     | i_andcm   of register * register * logicond * register
  212.     | i_uxor    of register * register * unitcond2 * register
  213.     | i_uaddcm  of register * register * unitcond2 * register
  214.     | i_uaddcmt of register * register * unitcond2 * register
  215.     | i_dcor    of register * register * unitcond2
  216.     | i_idcor   of register * register * unitcond2
  217.     | i_addi    of im11 * register * arithcond2 * register
  218.     | i_addio   of im11 * register * arithcond2 * register
  219.     | i_addit   of im11 * register * arithcond2 * register
  220.     | i_addito  of im11 * register * arithcond2 * register
  221.     | i_subi    of im11 * register * arithcond2 * register
  222.     | i_subio   of im11 * register * arithcond2 * register
  223.     | i_comiclr of im11 * register * arithcond2 * register
  224.     | i_vshd    of register * register * shiftcond * register
  225.                 (* hibits     lobits             shiftby   target *)
  226.     | i_shd     of register * register * shiftcond * im5 * register
  227.     | i_vextru  of register * shiftcond * im5 * register
  228.     | i_vextrs  of register * shiftcond * im5 * register
  229.                 (* source                 start len   target *)
  230.     | i_extru   of register * shiftcond * im5 * im5 * register
  231.     | i_extrs   of register * shiftcond * im5 * im5 * register
  232.     | i_vdep    of register * shiftcond * im5 * register
  233.     | i_dep     of register * shiftcond * im5 * im5 * register
  234.     | i_vdepi   of im5 * shiftcond * im5 * register
  235.     | i_depi    of im5 * shiftcond * im5 * im5 * register
  236.     | i_zvdep   of register * shiftcond * im5 * register
  237.     | i_zdep    of register * shiftcond * im5 * im5 * register
  238.     | i_zvdepi  of im5 * shiftcond * im5 * register
  239.     | i_zdepi   of im5 * shiftcond * im5 * im5 * register
  240.  
  241.         (* control instructions *)
  242.     | i_break   of im5 * im13
  243.     | i_rfi
  244.     | i_rfir
  245.     | i_ssm     of im5 * register
  246.     | i_rsm     of im5 * register
  247.     | i_mtsm    of register
  248.     | i_mtctl   of register * cregister
  249.     | i_mfctl   of cregister * register
  250.     | i_ldsid   of register * register
  251.     | i_mtsp    of register * sregister
  252.     | i_mfsp    of sregister * register
  253.     | i_sync
  254.  
  255.     (* floating point *)
  256.                 (* base       index                    target *)
  257.     | i_fldwx   of register * register * modifyshift * fregister * fphalf
  258.     | i_fstwx   of register * register * modifyshift * fregister * fphalf
  259.     | i_flddx   of register * register * modifyshift * fregister
  260.     | i_fstdx   of register * register * modifyshift * fregister
  261.  
  262.                 (* base     index              target *)
  263.     | i_fldws   of register * im5 * modifyab * fregister * fphalf
  264.     | i_fstws   of register * im5 * modifyab * fregister * fphalf
  265.     | i_fldds   of register * im5 * modifyab * fregister
  266.     | i_fstds   of register * im5 * modifyab * fregister
  267.  
  268.     | i_fcpy    of fregister * fpformat * fregister
  269.     | i_fabs    of fregister * fpformat * fregister
  270.     | i_fsqrt   of fregister * fpformat * fregister
  271.     | i_frnd    of fregister * fpformat * fregister
  272.  
  273.     | i_fcnvff  of fregister * fpformat * fregister * fpformat
  274.     | i_fcnvxf  of fregister * fpformat * fregister * fpformat
  275.     | i_fcnvfx  of fregister * fpformat * fregister * fpformat
  276.     | i_fcnvfxt of fregister * fpformat * fregister * fpformat
  277.  
  278.     | i_fcmp    of fregister * fregister * fpformat * fpcond
  279.     | i_ftest
  280.     | i_fadd    of fregister * fregister * fpformat * fregister
  281.     | i_fsub    of fregister * fregister * fpformat * fregister
  282.     | i_fmpy    of fregister * fregister * fpformat * fregister
  283.     | i_fdiv    of fregister * fregister * fpformat * fregister
  284.     | i_xmpyu   of fregister * fregister * fregister
  285.     | i_mpyadd  of fregister * fregister * fregister * fregister * fregister
  286.     | i_mpysub  of fregister * fregister * fregister * fregister * fregister
  287.  
  288.         (* these instructions have fields whose values depends on the final
  289.            positioning of the labels. they are the instructions generated by 
  290.            the EXPAND fuction. *)
  291.     | i_sdi_ldo    of register * 'label label_expr * register
  292.     | i_sdi_addil  of 'label label_expr * register
  293.     | i_sdi_ldil   of 'label label_expr * register
  294.         | i_sdi_ldw    of register * 'label label_expr * register
  295.     | i_sdi_comb   of register * register * arithcond2 * 'label label_expr * nullify
  296.         | i_sdi_bl     of 'label label_expr * nullify * register
  297.         | i_sdi_bb     of register * im5 * shiftcond * 'label label_expr * nullify
  298.  
  299.       (* these instructions are ones that might be nullified by the
  300.          previous instruction. *)
  301.     | i_nullified  of 'label instruction
  302.  
  303.     fun invert_cond (cc c) = (cc_not c)
  304.       | invert_cond (cc_not c) = (cc c)
  305.  
  306.     (* XXX *)
  307.     fun latency _ = 1
  308.  
  309.     (* 32 regs + 32 fp regs + 32 control regs + memory + npc *)
  310.     val numResources = 98
  311.  
  312.     local
  313.     fun reg r = r
  314.     fun freg r = 32 + r
  315.     fun creg r = 64 + r
  316.     val mem = 96
  317.     val npc = 97
  318.  
  319.     fun load(r1, r2) = ([mem, reg r1], [reg r2])
  320.     fun store(r1, r2) = ([reg r1], [mem, reg r2])
  321.     in
  322.  
  323.     (* this should sequentialize everything *)
  324.     fun rUseDef x = ([0], [0])
  325.         (*
  326.         case x of
  327.         i_nop => ([], [])
  328.           | i_ldw(r1, _, r2) => load(r1, r2)
  329.           | i_ldh(r1, _, r2) => load(r1, r2)
  330.           | i_ldb(r1, _, r2) => load(r1, r2)
  331.           | i_stw(r1, _, r2) => store(r1, r2)
  332.           | i_sth(r1, _, r2) => store(r1, r2)
  333.           | i_stb(r1, _, r2) => store(r1, r2)
  334.           | i_ldwm
  335.         *)
  336.     end
  337.  
  338. end (* HppaInstrSet *)
  339.